package com.xjh.basestudy.designmode.structureMode.structureMode2_Composite;

/**
 * @Author XuJianHua
 * @Date 2022/9/24 23:58
 * @Description
 * 文件夹或文件都有一个名字，所以在第4行的构造方法中接收并初始化在第2行已定义的节点名，否则不允许节点被创建，这也是可以固化下来的逻辑。
 * 对于如何实现代码第9行中的添加子节点方法add(Node child)暂时还不能确定，所以我们声明其为抽象方法，
 * 模糊此行为并留给子类去实现。需要注意的是，对于抽象节点类Node的抽象方法其实还可以更加丰富，
 * 例如“删除节点”“获取节点”等，这里为了简化代码只声明了“添加节点”方法。下面我们就来实现文件夹类，此类肩负着确立树形结构的重任，这也是组合模式数据结构的精髓所在，

 */
public abstract class Node {
    protected String name;//节点命名

    public Node(String name) {//构造方法需传入节点名
        this.name = name;
    }
    // 基类的 protected 成员是包内可见的，并且对子类可见；
    // 添加下级子节点方法
    protected abstract void add(Node child);

    // 我们在第11行实现了以接收空格数量space为传入参数的展示方法tree(int space)，
    // 其中的循环体会输出space个连续的空格，最后再输出节点名称。因为此处是抽象节点类的实体方法，
    // 所以要保持其通用性。我们抽离出所有节点“相同”的部分作为“公有”的代码块，而“不同”的行为部分则留给子类去实现。

    protected void tree(int space) {
        for (int i = 0; i < space; i++) {
            System.out.print("  ");//先循环输出space个空格（不换行）
        }
        System.out.println(name);//接着再输出自己的名字并换行
    }
}